<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <title>汇编  &middot; sitename</title>
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1">


<meta name="description" content="" />

<meta name="keywords" content="">


<meta property="og:title" content="汇编  &middot; sitename ">
<meta property="og:site_name" content="sitename"/>
<meta property="og:url" content="https://lvzongcheng.gitee.io/%E6%B1%87%E7%BC%96/" />
<meta property="og:locale" content="en-EN">


<meta property="og:type" content="article" />
<meta property="og:description" content=""/>
<meta property="og:article:published_time" content="2017-12-14T00:00:00Z" />
<meta property="og:article:modified_time" content="2017-12-14T00:00:00Z" />

  

  

<script type="application/ld+json">
  {
    "@context": "http://schema.org",
    "@type": "Article",
    "headline": "汇编",
    "author": {
      "@type": "Person",
      "name": "LvZongCheng"
    },
    "datePublished": "2017-12-14",
    "description": "",
    "wordCount":  474 
  }
</script>



<link rel="canonical" href="https://lvzongcheng.gitee.io/%E6%B1%87%E7%BC%96/" />

<link rel="apple-touch-icon-precomposed" sizes="144x144" href="https://lvzongcheng.gitee.io/touch-icon-144-precomposed.png">
<link href="https://lvzongcheng.gitee.io/favicon.png" rel="icon">

<meta name="generator" content="Hugo 0.60.0" />

  <!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->

<link href='https://fonts.googleapis.com/css?family=Merriweather:300%7CRaleway%7COpen+Sans' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="/css/font-awesome.min.css">
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/css/highlight/default.css">

  
  
	<script>
	  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
	  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
	  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
	  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

	  ga('create', 'Your Google Analytics tracking code', 'auto');
	  ga('send', 'pageview');

	</script>

</head>
<body>
  <main id="main-wrapper" class="container main_wrapper has-sidebar">
    <header id="main-header" class="container main_header">
  <div class="container brand">
  <div class="container title h1-like">
  <a class="baselink" href="https://lvzongcheng.gitee.io">
  LvZongCheng

</a>

</div>

  
<div class="container topline">
  
  淡定 执著 进取 自律


</div>


</div>

  <nav class="container nav primary no-print">
  

<a class="homelink" href="https://lvzongcheng.gitee.io">home</a>


  
<a href="https://lvzongcheng.gitee.io/framework" title="Show list of Frameworks">Frameworks</a>

<a href="https://lvzongcheng.gitee.io/java" title="Show list of Java">Java</a>

<a href="https://lvzongcheng.gitee.io/linux" title="Show list of Linux">Linux</a>

<a href="https://lvzongcheng.gitee.io/redis" title="Show list of Redis">Redis</a>

<a href="https://lvzongcheng.gitee.io/sql" title="Show list of SQL">SQL</a>

<a href="https://lvzongcheng.gitee.io/Spring" title="Show list of Spring">Spring</a>

<a href="https://lvzongcheng.gitee.io/tools" title="Show list of Tools">Tools</a>

<a href="https://lvzongcheng.gitee.io/webpage" title="Show list of WebPage">WebPage</a>

<a href="https://lvzongcheng.gitee.io/information" title="Show list of information">information</a>

<a href="https://lvzongcheng.gitee.io/network" title="Show list of network">network</a>

<a href="https://lvzongcheng.gitee.io/%E5%BE%AE%E6%9C%8D%E5%8A%A1" title="Show list of 微服务">微服务</a>

<a href="https://lvzongcheng.gitee.io/%E6%80%BB%E7%BB%93" title="Show list of 总结">总结</a>

<a href="https://lvzongcheng.gitee.io/%E6%9C%BA%E5%99%A8%E8%87%AA%E5%8A%A8%E5%8C%96" title="Show list of 机器自动化">机器自动化</a>

<a href="https://lvzongcheng.gitee.io/%E6%B1%87%E7%BC%96" title="Show list of 汇编">汇编</a>

<a href="https://lvzongcheng.gitee.io/%E8%AE%B0%E4%BA%8B%E6%9C%AC" title="Show list of 记事本">记事本</a>


</nav>

<div class="container nav secondary no-print">
  
<a id="contact-link-email" class="contact_link" rel="me" aria-label="Email" href="mailto:Lyc19880405@163.com">
  <span class="fa fa-envelope-square"></span></a>



<a id="contact-link-github" class="contact_link" rel="me" aria-label="Github" href="https://github.com/enten/hugo-boilerplate">
  <span class="fa fa-github-square"></span></a>




 


















</div>


  

</header>


<article id="main-content" class="container main_content single">
  <header class="container hat">
  <h1>汇编
</h1>

</header>

  <div class="container content">
  <p><a href="https://github.com/LvZongCheng/Note.git">https://github.com/LvZongCheng/Note.git</a> get地址
<a href="https://github.com/LvZongCheng/Note">https://github.com/LvZongCheng/Note</a></p>
<p>C:\Users\Lyc19\VirtualBox VMs\winXP\Snapshots
8086CPU  cpu 由 运算器、控制器、寄存器</p>
<p>1.8086CPU寄存器 名称：AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW
都是16位的，可以存放两字节。</p>
<p>AX、BX、CX、DX 通用寄存器</p>
<p>执行指令时，8086cpu自动取ds中的数据为内存单元的段地址。
8086cpu不支持将数据直接送入段寄存器的操作，ds
是段寄存器，数据要先放入通用寄存器在转到段寄存器</p>
<pre><code>数据&gt;通用寄存器在转到&gt;段寄存器
</code></pre>
<p>DS寄存器存放要访问的数据的段地址
[bx]表示访问内存中的偏移地址
cx 保存程序长度</p>
<h3 id="heading">段寄存器</h3>
<p>段寄存器就是提供段地址的。
8086CPU 有4个段寄存器：CS、SS、DS、ES
CS 代码段寄存器 ip存放偏移地址
DS 数据段寄存器（存放要访问的数据的段地址）
SS 存放栈顶的段地址 sp 存放栈偏移地址</p>
<p>ip 为指令指针寄存器。
当8086CPU要访问内存时，由这4个段寄存器提供内存单元的段地址</p>
<p>修改 cs、ip 指令
1.jmp 段地址：偏移地址
2.仅修改IP内容：
jmp 某一合法寄存器
用寄存器中的值修改IP</p>
<h3 id="heading1">通用寄存器</h3>
<p>通用寄存器：结构</p>
<p>AX:{AL（低位）、AH（高位）高低位是为了兼容老版本8位寄存器}</p>
<p>16位结构描述CPU如下特征
（1.运算器一次最多可以处理16位的数据。
（2.寄存器的最大宽度为16位。
（3.寄存器和运算器之间的通路是16为的。</p>
<p>1.地址加法器</p>
<p>地址加法器是为了解决 地址总线传送（20位）位与8086CPU传送（16位）位之间差别的运算器</p>
<p>解决办法，用两个地址拼成20位物理地址输出</p>
<p>段地址*16+偏移地址(即段地址左移一位+偏移地址 )，得出物理地址 (cs+ip)
注：N进制左移一位及表示乘以N
debug 常用功能：
1.r 查看、改变cpu 寄存器的内容
2.d 查看内存中的内容
3.e 改写内存中的内容
4.u 将内存中的机器指令翻译成汇编指令
5.t 命令执行一条机器指令
6.a 汇编指令的格式在内存中写入一条机器指令。</p>
<p>-quit 退出</p>
<p>e 段地址：偏移地址</p>
<p>e b810:0 01 01 02 02 03 03 04 04 向显卡写入内容
b810:0 显存位置</p>
<p>向内存 10000H 写入值 23 11 22 66
-e 1000:0 23 11 22 66</p>
<p>mov 指令：
1.将数据直接送入寄存器；
2.将一个寄存器中的内容送人另一个寄存器
3.可以将一个内存单元中的内容送入一个寄存器</p>
<p>mov 寄存器名，内存单元地址
mov 指令中的[&hellip;]说明操作对象是一个内存单元,[&hellip;]中的
0说明这个内存单元的偏移地址是0，段地址默认放
在ds中 例：mov ax,[0] 偏移地址为0的传给ax
mov [0]:cx 赋值给偏移地址为0</p>
<p>用mov 指令访问内存单元，可以在mov指令中只给出单元的偏移地址，
此时，段地址默认在DS寄存器中。</p>
<p>mov 指令形式
mov 寄存器，数据
mov 寄存器，寄存器
mov 寄存器，内存单元
mov 内存单元，寄存器
mov 段寄存器，寄存器</p>
<p>问题 1.错误命令撤销</p>
<p>add 加
add 寄存器，数据
add 寄存器，寄存器
add 寄存器，内存单元
add 内存单元，寄存器</p>
<p>sub 减
sub 寄存器，数据
sub 寄存器，寄存器
sub 寄存器，内存单元
sub 内存单元，寄存器</p>
<p>下载汇编经熟软件，汇编指令提示</p>
<p>push 入栈
pop 出栈</p>
<p>push ax：将寄存器ax中的数据送入栈中
pop ax：从栈顶取出数据送人ax。</p>
<p>8086cpu的入栈和出栈操作都是以字为单位进行的。</p>
<h3 id="-csip-">修改 CS,IP 的指令</h3>
<p>CS,IP 指示了CPU 当前要读取指令的地址</p>
<p>mov不能修改8086cpu CS,IP值,可以用 jmp指令修改cs,ip值。</p>
<p>jmp 段地址：偏移地址</p>
<p>示例：
jmp 2AE3:3 执行后 CS=2AE3H,IP=0003H CPU将从CS=2AE3H 初读取指令
jmp 3:2AE3 执行后 CS=0003H,IP=2AE3H</p>
<h3 id="heading2">代码示例</h3>
<p>-d fff0:0 FF    查看 FFF00H-FFFFFH  内存段范围中的内容</p>
<h3 id="heading3">第三章</h3>
<p>ss 指定栈存储空间位置  sp 存放栈偏移地址</p>
<p>注：任意时刻：ss:sp 指向栈顶元素。</p>
<p>ss 寄存器</p>
<p>sp 0010 写入或读取时指针移动位（每次向下或上移动两位）</p>
<p>1.栈 （last in first out 后进先出）
push(入栈)
pop （出栈）指令</p>
<p>push和pop指令格式（一）
push  寄存器 ：将一个寄存器中的数据入栈</p>
<pre><code>例 push ax 

pop 寄存器 ：用一个寄存器接收出栈的数据

例 pop bx
</code></pre>
<p>push和pop指令格式（二）
push  段寄存器 ：将一个段寄存器中的数据入栈</p>
<pre><code>例 push ds

pop 段寄存器 ：用一个段寄存器接收出栈的数据

例 pop es
</code></pre>
<p>清零（将ax 清零）
sub ax,ax 将ax清零，也可以用 mov ax,0，
sub ax,ax 的机器码为两个字节，
mov ax,0  的机器码为三个字节。
或 xoy ax,ax 异或清零</p>
<p>栈空间是内存空间的一部分，它只是一段可以以一种特殊的
方式进行访问的内存空间。</p>
<p>push ax:将寄存器ax 中的数据传入栈中</p>
<p>执行指令时，8086cpu自动取DS中的数据为内存单元的段地址</p>
<p>8086CPU不支持将数据直接送入段寄存器的操作
数据 到  通用寄存器 到  段寄存器</p>
<p>问题
1).cpu 如何知道一段内存空间被当作栈使用的
寄存器cs和ip中存放着当前指令的段地址和偏移地址。
段寄存器ss 存放栈顶的段地址
寄存器sp  存放栈顶的偏移地址
任意时刻，ss：sp指向栈顶元素</p>
<p>2).执行push和pop的时候，如何知道哪个单元是栈顶单元</p>
<p>指令 
pop ax</p>
<pre><code>(1)将ss:sp 指令指向的内存单元处的数据送人ax中；
   （2）sp=sp+2  ss:sp 指向当前栈顶下面的单元，以当前
栈顶下面的单元为新的栈顶。
</code></pre>
<p>栈顶越界，栈空越界。</p>
<p>push和pop 指令是可以在寄存器和内存之间传送数据的。
8086cpu 没有记录栈顶上限和下限的寄存器。</p>
<p>栈堆区别
连续内存单元，越界就访问其他内存单元。</p>
<p>堆是零散内存根据线性组合起来的</p>
<p>2.栈段</p>
<h3 id="heading4">伪指令</h3>
<p>伪指令：
伪指令是由编译器来执行的指令，编译器根据伪指令来进行相关的编译工作。</p>
<p>xxx segment 
xxx  ends</p>
<p>segment 和 ends 成对使用的伪指令。在写可被编译器编译的汇编程序时，
必须要用到的一对伪指令
segment 和 ends 功能是定义一个段，segment 说明一个段开始，ends 说明一个段结束。</p>
<p>格式：
段名 segment
段名 ends</p>
<p>一个汇编程序由多个段组成，这些段用来存放代码，数据或当作栈空间来使用。</p>
<p>end 是一个汇编程序的结束标记，编译器在编译汇编程序过程中如果碰到了伪指令
end，就结束对源程序的编译。程序写完后要在结尾处加end指令否则无法知道程序
在何处结束。</p>
<p>注：注意end 与 ends 区别</p>
<p>assume ：含义为“假如”</p>
<p>pe文件结构对黑客很重要</p>
<p>&mdash;&ndash;标号</p>
<p>一个标号指代一个地址</p>
<p>程序返回在末尾添加
mov ax,4c00H
int 21H</p>
<p>int DOS 中断机制</p>
<p>终结;</p>
<p>通知编译器一个段结束 段名 ends			伪指令		编译时，由编译器执行</p>
<p>通知编译器程序结束   end			伪指令		编译时，由编译器执行</p>
<p>程序返回     	     mov ax,4c00H  int 21H	汇编指令	编译时，由CPU执行</p>
<p>汇编程序从写出到执行的过程</p>
<p>编程&mdash; l.asm&mdash;编译&mdash; 1.obj&mdash;连接&mdash; 1.exe&mdash;加载&mdash; 内存中的程序&mdash;运行<!-- raw HTML omitted -->
(edit)         (masm)         (link)        (command)</p>
<p>源程序编译后，得到了存有机器码的目标文件，目标文件中的有些内容还
不能直接用来生成可执行文件，连接程序将这些内容处理为最终的可执行信息。
所以，在只有一个源程序文件，而又不需要调用某个库中的子程序的情况下，也
必须用连接程序对目标文件进行处理，生成可执行文件
可执行文件才是要得到的最终目的</p>
<p>debug将程序从可执行文件加载入内存后，cx中存放的是程序的长度。</p>
<h3 id="-bxloop-">五章 [bx]与loop 指令</h3>
<p>1.）loop 标号
cx 存放着loop 要执行的次数</p>
<p>例：
mov cx,循环次数
s: 
循环执行的程序段
loop s</p>
<p>计算时要考虑运算结果的数据大小是否会超出存储范围</p>
<p>在汇编源程序中，数据不能以字母开头，所以要在前面加（0）</p>
<p>debug 循环跟踪调试引入了G命令
也可以使用p命令</p>
<p>步骤
1.用-u 查看 (例：-u 13eb:0)
2.用-g 跳转到下一条 (例：-g 0014)</p>
<p>2.）在masm编译器编译过程中
mov al,[0] 是把0给al 而不是把内存偏移地址为[0]的值给al
这与 debug中有所不同。如果要将指定内存地址中的值给al
用法入下</p>
<p>1.mov al,ds:[0]
2.mov bx,[0]
mov al,[bx]
3.mov al,ds:[0]
4.mov al,ds:[bx]</p>
<p>3.）计算时类型不匹配和结果的不越界
（dx）=(dx)+内存中的8位数据
（dl）=(dl)+内存中的8位数据
第一种方法中的问题是两个运算对象的类型不匹配
第二种方法中的问题是结果有可能越界
*解决方法
将内存单元中的8位数据赋值到一个16位寄存器ax中，
再将ax中的数据加到dx上，从而使两个运算对象的类型
匹配并且结果不会越界</p>
<p>4.)一段安全空间
pc中0:200-0:2ff的256个字节空间合法程序不会使用这段空间</p>
<pre><code>###六章 包含多个段的程序
</code></pre>
<p>dw (define word) 定义了8个字型数据（数据之间用逗号分隔）16个字节
dd (double word）双字型数据 32 位 
db (define byte) 每个字节只占一个字节单元</p>
<p>dup 是一个操作符 用来进行数据的重复
示例
db 重复次数 dup(重复的字节型数据)
dw 重复次数 dup(重复的字节型数据)
dd 重复次数 dup(重复的字节型数据)</p>
<p>db 3 dup(&lsquo;abc&rsquo;,&lsquo;ABC&rsquo;) 定义了18个字节，相当于 db &lsquo;abcABCabcABCabcABC&rsquo;
029开始</p>

</div>


  
</article>
      <footer id="main-footer" class="container main_footer">
  

  <div class="container nav foot no-print">
  
<a href="https://lvzongcheng.gitee.io/license">license</a>


  <a class="toplink" href="#">back to top</a>

</div>

  <div class="container credits">
  
<div class="container footline">
  
  code with <!-- raw HTML omitted --><!-- raw HTML omitted -->


</div>


  
<div class="container copyright">
  
  (c) 2015 yourname.


</div>


</div>

</footer>

    </main>
    
<script type="text/javascript">
  (function() {
    
    
    if (window.location.hostname == "localhost")
      return;
    var dsq = document.createElement('script'); dsq.async = true; dsq.type = 'text/javascript';
    dsq.src = '//your_disqus_shortname.disqus.com/count.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
  })();
</script>



<script src="/js/highlight.pack.js"></script>
<script>hljs.initHighlightingOnLoad();</script>



    
  </body>
</html>

